// 导入 http 模块
import http from 'wechat-http'

/**
 * 配置接口基础路径
 */
http.baseURL = 'https://live-api.itheima.net'

/**
 * 配置请求拦截器
 */
http.intercept.request = (config) => {
  // console.log(config, '请求的配置对象')
  const token = getApp().token
  if (token) {
    // 有token 才需要添加请求头
    // config.header.Authorization = token // 万一将来请求配置了其他的请求头信息

    config.header = {
      Authorization: token,
      ...config.header, // 将来能够额外携带其他的请求头信息
    }
  }

  // config.header = {
  //   a: 1,
  //   b: 2,
  // }

  return config
}

/**
 * 配置响应拦截器
 */
http.intercept.response = async (res) => {
  // console.log(res, '原始数据')

  if (res.statusCode === 401) {
    // token过期了 失效了 => 请求接口 获取新token
    console.log('失效了', res)

    // 我们不能让refreshToken那个接口走下面的请求代码
    // 我要处理的就是刷新token那个接口导致的401
    if (res.config.url.endsWith('refreshToken')) {
      const pageStack = getCurrentPages()
      const current = pageStack[pageStack.length - 1]
      const url = current.route

      // 跳转登录页重新登录
      return wx.redirectTo({
        url: '/pages/login/index?backTo=/' + url,
      })
    }

    // 准备发请求
    const res2 = await http({
      url: '/refreshToken',
      method: 'post',
      header: {
        Authorization: getApp().refresh_token,
      },
    })

    // 后端返回的新的token  refreshToken 覆盖老的失效的数据
    // console.log(res2, 777666)
    getApp().setToken(res2.data.token, res2.data.refreshToken)

    // 无感刷新 => 就是将之前错误的请求重新用正确的token发送出去!!!
    // res.config => 就是这次错误请求的所有配置项
    // 这句话的意思是 原来的请求怎么发的  以相同的姿势再发一遍
    return http({
      ...res.config, // 有一个请求头是错的!!
      // 这边覆盖一下
      header: {
        Authorization: getApp().token,
      },
    })
  }

  // 过滤接口返回的数据
  return res.data
}

/**
 * 挂载方法到全局
 */
wx.http = http

/**
 * 模块导出
 */
export default http
